<?php
error_reporting(E_ALL);           // Activacion del reporte det
ini_set('display_errors', '1');   // errores en el codigo

/**
 * Description of BaseDatos
 */
class BaseDatos {


   private $servidor = "localhost";
   private $usuario = "root";
   private $password = "";
   private $baseD = "pinf";
   private $target;
   private $attsPerfil = array (
      "usuario", "password", "email", "fechaNacimiento", "Seguridad_ID", 
      "Muro_ID", "nombre", "apellido", "es_Admin"
   );
   private $attsNoticia = array(
      "id", "titulo", "autor", "fecha", "descripcion", 
      "num_gusta", "num_nogusta", "id_cuerpo", "id_muro", "id_admin", "visible"
   );
   private $attsCuerpo = array("id", "contenido");
   private $attsMuro = array("id", "num_max_publicaciones", "num_publicaciones");
   private $attsGrupo= array(
      "ID", "nombre", "ID_Lider","ID_Muro", "descripcion",
      "num_miembros", "visible"
   );
   private $attsEvento = array(
      "nombre","ID_Organizador","ID_Muro","descripcion","ubicacion","fecha",
      "num_gusta","num_nogusta","num_miembros","visible"
   );
   private $attsUnirseAGrupo = array("ID_Perfil, ID_Grupo");
   private $attsForo = array("ID", "administrador");
   //Nota : idMuro es varChar(8), idPerfil es Varchar(20), idMuro es varChar(8)
   /**
   *  Constructor
   */
    public function __construct() {
        $this->target = mysql_connect($this->servidor, $this->usuario, $this->password ) or die ('Ha fallado la conexi&oacute;n: '.mysql_error());
        mysql_select_db($this->baseD, $this->target) or die ('Error al seleccionar la Base de Datos: '.mysql_error());                
    }

    /**
     * Metodo privado utilizado para insertar elementos en una tabla particular.
     * Solamente es util para listas de atributos que tienen unicamente atributos de tipo VARCHAR.
     * Par�metros: String $tabla -> nombre de la tabla donde se desea agregar el elemento
     *             Array $attsN -> Nombres de los campos que se desean agregar
     *             Array $atts -> Arreglo con los valores de los atributos que se desean agregar
     *                            en el mismo orden en que est�n presentes en '$attsN'
     *             String $targ -> Conexion a la base de datos
     */
    private static function insertar($tabla, $attsN, $atts, $targ) {
        $query = "INSERT INTO ".$tabla." (".implode(",", $attsN).") VALUES (";
        foreach ($atts as $value) {
            $query .= "'" . mysql_real_escape_string($value) . "',";
        }
        $query = substr($query, 0, -1) . ")";
        if (!mysql_query($query, $targ)) {
		    echo mysql_error();
            throw new Exception("Error al agregar.");
        }
    }
	
    private static function editar($tabla, $attsN, $atts, $targ) {
        $query = "UPDATE ".$tabla." SET ";
        for ($i = 1; $i < count($attsN); $i++) {
            $query .= $attsN[$i]." = '" . mysql_real_escape_string($atts[$i]) . "',";
        }
        $query = substr($query, 0, -1) . " WHERE " . $attsN[0] . " = " . $atts[0];
        if (!mysql_query($query, $targ)) {
            throw new Exception("Error al editar.");
        }
    }

    private static function eliminar($tabla, $attsN, $atts, $targ){
        $query = "DELETE FROM ".$tabla." WHERE (" .$attsN[0] . "= '" . mysql_real_escape_string($atts[0]) ."'";
        if ($attsN[1] != null){
          $query .= " AND ". $attsN[1] ." = '" .  mysql_real_escape_string($atts[1]) . "'";
        }
        $query .= ")";
        
        if (!mysql_query($query, $targ)) {
            throw new Exception("Error al eliminar.");
        }
    }

    /**
     * Metodo para agregar una noticia a la base de datos
     * Parametros: Noticia $noticia -> Noticia que se desea agregar a la base de datos
     */
    public function agregarNoticia(Noticia $noticia) {
        // Primero se agrega el cuerpo de la noticia a la base de datos.
        $atts = array(null, $noticia->getCuerpo());
        self::insertar("Cuerpo", $this->attsCuerpo, $atts, $this->target);
        $idc = mysql_insert_id();

        // Esta es la seccion para agregar el muro, que debe ser modificada cuando se haga la implementacion del metodo agregarMuro()
        $query = "INSERT INTO Muro (Num_Max_pub) VALUES (5)";
        if(!mysql_query($query)){
          throw new Exception("Error al crear el muro");
        }
        $idm = mysql_insert_id();

        // Finalmente, se agrega la noticia
        $query = "INSERT INTO noticia (titulo, autor, fecha, descripcion, ID_Cuerpo, 
                  ID_Muro, ID_Admin) VALUES ('".$noticia->getTitulo()."', '".$noticia->getAutor()."', '".$noticia->getFecha().
                  "', '".$noticia->getDescripcion()."', ".$idc.", ".$idm.", '".$noticia->getIdAdmin()."')";
        if(!mysql_query($query))
           throw new Exception("Error al agregar la noticia");
        $idn = mysql_insert_id();
        
        return array($idn, $idm);
    }
    
    public function editarNoticia(Noticia $noticia) {
        // Primero se agrega el cuerpo de la noticia a la base de datos.
        $atts = array($noticia->getId(), $noticia->getCuerpo());
        self::editar("Cuerpo", $this->attsCuerpo, $atts, $this->target);

        // Finalmente, se edita la noticia
        $atts = array($noticia->getId(), $noticia->getTitulo(), $noticia->getAutor(), $noticia->getFecha(), $noticia->getDescripcion(), $noticia->getNumGusta(), $noticia->getNumNoGusta(), $noticia->getId(), $noticia->getIdMuro(), $noticia->getIdAdmin(), $noticia->getVisible());
        self::editar("Noticia", $this->attsNoticia, $atts, $this->target);
    }
    
	public function eliminarNoticia($noticia) {
		if ($noticia->getVisible() == 0) {
			$atts = array($noticia->getId(), $noticia->getTitulo(), $noticia->getAutor(), $noticia->getFecha(), $noticia->getDescripcion(), $noticia->getNumGusta(), $noticia->getNumNoGusta(), $noticia->getId(), $noticia->getIdMuro(), $noticia->getIdAdmin(), $noticia->getVisible());
			self::editar("Noticia", $this->attsNoticia, $atts, $this->target);
	    } else
			return null;
	}
		
	public function buscarNoticia($id) {
		$query = mysql_query("SELECT * FROM Noticia WHERE ID = '".$id."' AND visible = 1");
		if (!$query)
			return null;
		$row = mysql_fetch_array($query);
		return array($row['fecha'], $row['titulo'], $row['autor'], $row['descripcion'], $row['ID_Admin'], $row['ID_Muro'], $row['visible']);
	}
	
	public function buscarCuerpo($id) {
		$query = mysql_query("SELECT * FROM Cuerpo WHERE ID = '".$id."'");
		if (!$query) {
			return null;
		}
		$row = mysql_fetch_array($query);
		return $row['contenido'];
	}
	
	/*Funcion que devuelve los ID de las ultimas 5 noticias existentes en la base de datos,
 en un arreglo
	*/
   public function buscarUltimasNoticias() {
      $query = mysql_query("SELECT ID FROM Noticia WHERE visible = 1 ORDER BY ID DESC LIMIT 5");
      $row = mysql_fetch_array($query);
      $result = array($row['ID']);
      while (($row = mysql_fetch_array($query)) != null) {
	     array_push($result, $row['ID']);
      }
      return $result;
   }
	/*Funcion que devuelve los ID de todas las noticias existentes en la base de datos,
	 en un arreglo
	*/
   public function buscarTodasNoticias() {
      $query = mysql_query("SELECT ID FROM Noticia WHERE visible = '1' ORDER BY ID DESC");
      $row = mysql_fetch_array($query);
      $result = array($row['ID']);
      while (($row = mysql_fetch_array($query)) != null) {
	     array_push($result, $row['ID']);
      }
      return $result;
   }
   
    
	//GRUPO
	
	
    /**
     * Metodo para agregar un grupo a la base de datos
     * Parametros: Grupo $grupo -> Grupo que se desea agregar a la base de datos
     */
    public function agregarGrupo(Grupo $grupo) {
      
      $query = "INSERT INTO Muro (Num_max_pub) VALUES (5)";
        if(!mysql_query($query)){
		  echo mysql_error();
          throw new Exception("Error al crear el muro");
        }
	
        $idm = mysql_insert_id();
        // Finalmente, se agrega el grupo
        $query= "INSERT INTO Grupo  (nombre, ID_Lider, ID_Muro, descripcion, num_miembros, visible) VALUES( '".$grupo->getNombre()."', '". $grupo->getLider()."', ".$idm.", '".$grupo->getDescripcion()."', ". $grupo->getNumMiembros().", ". $grupo->getVisible().")";
        
        if(!mysql_query($query)){
		  echo mysql_error();
          throw new Exception("Error al crear el grupo");
        }
               
        return array(mysql_insert_id(),$idm);
    }
	/*Funcion que devuelve en un arreglo todos los atributos del grupo con nombre $nombreGrupo
	 */
	public function buscarGrupo($id){
		$select = ("SELECT * FROM Grupo WHERE ID = '".$id."' AND visible = 1" );
		if(!($query = mysql_query($select, $this->target))){
		 throw new Exception("Error al buscar el grupo");
	    }
		else{
		if (mysql_num_rows($query)>0){
		   return mysql_fetch_assoc($query);
		}
		else
		return null;
		}
	}
	public function buscarGrupoPorNombre($nombre){
		$select = ("SELECT ID FROM Grupo WHERE nombre = '".$nombre."' AND visible = 1" );
		if(!($query = mysql_query($select, $this->target))){
		 throw new Exception("Error al buscar el grupo");
	    }
		else{
		if (mysql_num_rows($query)>0){
		   return mysql_fetch_assoc($query);
		}
		else
		return null;
		}
	}
	/* eliminarGrupo(Grupo $grupo)
	 * Funcion que recibe el nombre del grupo que se desea eliminar
	 * Precondicion: El grupo $grupo existe
	 * Postcondicion: El grupo es eliminado, cambiandole su atributo visible de 1 a 0.
	*/
	public function eliminarGrupo(Grupo $grupo){
	
	     $query = ("UPDATE Grupo SET visible = 0 WHERE ID = '".$grupo->getId()."'" );
		 if (!mysql_query($query, $this->target)){
			throw new Exception("Error al eliminar el grupo");
		 }
	}
	
	/* modificarGrupo(Grupo $grupo)
	 * Funcion que permite modificar la descripcion de un grupo existente en la base de datos
	 * Precondicion: El grupo '$grupo' existe en la base de datos
	 * Postcondicion: La descripcion del grupo ha sido modificada
	 */
	public function modificarGrupo(Grupo $grupo){
	  $query = ("UPDATE Grupo SET descripcion = '" . $grupo->getDescripcion() . "' WHERE ID = '" . $grupo->getId() . "'");
	  if(!mysql_query($query, $this->target)){
	    throw new Exception("Error al eliminar el grupo");
	  }
	  return;
	}
	
	/*Funcion que devuelve los nombres de todos los grupos existentes en la base de datos
	 en un arreglo
	*/
	public function buscarTodosGrupos() {
      $query = mysql_query("SELECT ID FROM Grupo WHERE visible = 1 ORDER BY nombre ASC");
	  	  $result = array();
	  if (!$query){
	    throw new Exception("No hay grupos");
	  }

      while (($row = mysql_fetch_array($query)) != null) {
	     array_push($result, $row['ID']);
      }
      return $result;
   }
   
   public function buscarTodosMiembros($id){
     $query = mysql_query("SELECT ID_Perfil FROM EsMiembro WHERE ID_Grupo =".$id);
	  $row = mysql_fetch_array($query);
	  $result = array($row['ID_Perfil']);
      while (($row = mysql_fetch_array($query)) != null) {
	     array_push($result, $row['ID_Perfil']);
      }
      return $result;
   }
   
	/*votarMeGustaGrupo(Grupo $grupo)
	 *Votar me gusta del grupo $grupo
	 *Precondicion: el grupo $grupo existe
	 *Postcondicion: El $grupo posee numGusta incrementado en 1
	*/
    public function votarMeGustaGrupo(Grupo $grupo){
	 try{
	 $atts = array($grupo->getId(),$grupo->getNombre(), $grupo->getLider(),$grupo->getDescripcion(),$grupo->getNumGusta(), $grupo->getNumNoGusta(), $grupo->getNumMiembros(), $grupo->getVisible());
	 self::editar("Grupo", $this->attsGrupo, $atts, $this->target);
	 }catch(Exception $e){
	   echo "Error al editar grupo";
	   }
	}
	
	/*votarNoMeGustaGrupo(Grupo $grupo)
	 *Votar no me gusta del grupo $grupo
	 *Precondicion: el grupo $grupo existe
	 *Postcondicion: El $grupo posee numNoGusta incrementado en 1
	*/
	 public function votarNoMeGustaGrupo(Grupo $grupo){
	 $atts = array($grupo->getId(),$grupo->getNombre(), $grupo->getLider(),$grupo->getDescripcion(),$grupo->getNumGusta(), $grupo->getNumNoGusta(), $grupo->getNumMiembros(), $grupo->getVisible());
	 self::editar("Grupo", $this->attsGrupo, $atts, $this->target);
	}
	
	/*unirseAGrupo($idperfil, $idgrupo)
	*/
	public function unirseAGrupo($idperfil, $idgrupo){
	  $atts= array($idperfil,$idgrupo);
	  $status = true;
	  try{
	  self::insertar("EsMiembro",$this->attsUnirseAGrupo, $atts, $this->target);
	  } catch(Exception $e){
		 $status = false;
		 }
		 return $status;
	}
   
   /* Metodo que, dado un nombre de usuario genera hasta 5 recomendaciones de grupos
    * que le podrian interesar al usuario, basandose en sus amistades.
    */
    public function recomendarGrupo($usr){
    
      //Primero se ubican todos los amigos del usuario
      $query = "SELECT * from esamigo WHERE usuarioA = '".$usr."' OR usuarioB = '".$usr."'";
      if(!($result = mysql_query($query))){
         return null;
      }
      
      //Ahora, para cada amigo, se busca los grupos a los que pertenece, y a los que el perfil
      // que se desea recomendar no pertenece
      $grupos = array();
      while($arr = mysql_fetch_array($result)){
         $amigo = (($usr == $arr['usuarioA']) ? $arr['usuarioB'] : $arr['usuarioA']);
         $query = "SELECT * FROM esmiembro e JOIN grupo WHERE e.ID_Grupo = ID AND e.ID_Perfil = '".$amigo."' AND visible = 1
                   AND NOT EXISTS (SELECT * FROM esmiembro e0 WHERE e0.ID_Perfil = '".$usr."' AND e0.ID_Grupo = e.ID_Grupo)";
         if(!($resultMiem = mysql_query($query))){
            throw new Exception("Error en el query");
            continue;
         }         
         while($arrMiembro = mysql_fetch_array($resultMiem)){
            if(!array_key_exists($arrMiembro['ID_Grupo'], $grupos))
               $grupos[$arrMiembro['ID_Grupo']] = 1;
            else
               $grupos[$arrMiembro['ID_Grupo']] ++;
         }
      }
      
      //Por ultimo, se definen los grupos con mas amigos y se devuelve el resultado
      $i = 0;
      $min = 1000;
      $minI;
      $result = array();
      foreach($grupos as $id => $value){
         //Si aun no se tienen 5 grupos, se agrega automaticamente al resultado
         if($i != 5){
            $result[$i] = Grupo::buscarGrupo($id);
            //Se va calculando en cual indice se encuentra el grupo con menos repeticiones
            if($value < $min){
               $min = $value;
               $minI = $i;
            }
            ++ $i;
         //Proceso de reemplazo del nuevo entrante, si posee mas repeticiones que el minimo.
         }else{
            //Si el valor es mayor que el minimo contenido en el resultado se procede a reemplazar
            if($value > $min){
               $result[$minI] = Grupo::buscarGrupo($id);
               $min = $value;
               //Se debe calcular el nuevo indice minimo
               foreach($result as $key => $val){
                  if($grupos[$val->getId()] < $min){
                     $min = $grupos[$val->getId()];
                     $minI = $key;
                  }
               }
            }
         }         
      }
      return $result;
    }
  
       /*****EVENTO***********
        
       */
  public function eliminarEvento(evento $evento){
	   $query = ("UPDATE Evento SET visible = 0 WHERE ID = '".$evento->getId()."'" );
		 if (!mysql_query($query, $this->target)){
			throw new Exception("Error al eliminar el evento");
		 }
	   
	}
  
  /*Funcion que devuelve en un arreglo todos los atributos del evento con id $idEvento
   */      
  public function buscarEvento($idEvento){
		$select = ("SELECT * FROM Evento WHERE ID = '".$idEvento."' AND visible = 1" );
		if(!($query = mysql_query($select, $this->target))){
		 throw new Exception("Error al buscar el Evento");
	    }
		else{
		if (mysql_num_rows($query)>0){
		   return mysql_fetch_assoc($query);
		}
		else
		return null;
		}
	}
   
   /*Funcion que devuelve los ID de todos los eventos existentes en la base de datos
	 en un arreglo
    */     
   public function buscarTodosEventos() {
      $query = mysql_query("SELECT ID FROM Evento WHERE visible = 1");
	  $result = array();
      while (($row = mysql_fetch_array($query)) != null) {
	     array_push($result, $row['ID']);
      }
      return $result;
   }     
    /**
     * Metodo para agregar un evento a la base de datos
     * Par�metros: Evento $evento -> Evento que se desea agregar a la base de datos
     */
    public function agregarEvento(Evento $evento) {
     
      // Esta es la seccion para agregar el muro, que debe ser modificada cuando se haga la implementacion del metodo agregarMuro()
      //  $atts = array($evento->getId(), "-1", "0");
      //  self::insertar("muro", $this->attsMuro, $atts, $this->target);
        $query = "INSERT INTO Muro (Num_max_pub) VALUES (5)";
        if(!mysql_query($query)){
		  echo mysql_error();
          throw new Exception("Error al crear el muro");
        }	
        $idm = mysql_insert_id();
        // Finalmente, se agrega el evento
        $query = "INSERT INTO Evento (nombre, ID_Organizador, ID_Muro, descripcion, ubicacion, fecha)
                  VALUES ('".$evento->getNombre()."', '".$evento->getOrganizador()."', ".$idm.", '".$evento->getDescripcion().
                  "', '".$evento->getUbicacion()."', '".$evento->getFecha()."')";
        if(!mysql_query($query)){
           echo mysql_error();
          throw new Exception("Error al crear el evento");
        }        
        return mysql_insert_id();
    }
    
   public function editarEvento(Evento $evento) {
      $query = (
         "UPDATE Evento SET ".
         " descripcion = '".mysql_real_escape_string($evento->getDescripcion()).
         "', ubicacion = '".mysql_real_escape_string($evento->getUbicacion()).
         "', fecha = '".mysql_real_escape_string($evento->getFecha()).
         "' WHERE ID = '".mysql_real_escape_string($evento->getId())."'" 
      );
      if (!mysql_query($query, $this->target)) {
         throw new Exception("Error al eliminar el Evento");
      }
   }
   
   /*votarMeGustaEvento(Evento $evento)
	 *Votar me gusta del evento $evento
	 *Precondicion: el evento $evento existe
	 *Postcondicion: El $evento posee numGusta incrementado en 1
   */
   public function votarMeGustaEvento(Evento $evento){
        try{
            
         $query ="UPDATE Evento SET "." num_gusta = '".$evento->getNum_gusta()."' WHERE ID = '".$evento->getId()."'"; 
          if(!mysql_query($query, $this->target)){
	    throw new Exception("Error al eliminar el grupo");
	  }
          return;
	}catch(Exception $e){
            echo "Error al editar evento";
        }
   }
   
   /*votarNoMeGustaEvento(Evento $evento)
	 *Votar me gusta del evento $evento
	 *Precondicion: el evento $evento existe
	 *Postcondicion: El $evento posee numNoGusta incrementado en 1
   */
   public function votarNoMeGustaEvento(Evento $evento){
        try{
            $query ="UPDATE Evento SET "." num_nogusta = '".$evento->getNum_nogusta()."' WHERE ID = '".$evento->getId()."'"; 
          if(!mysql_query($query, $this->target)){
	    throw new Exception("Error al editar evento");
	  }
          return;
	}catch(Exception $e){
            echo "Error al editar evento";
        }
   }
   
   
   public function asistirEvento(invitacion_evento $invit){
        try{
            
         //$query ="UPDATE Evento SET "." num_miembros = '".$evento->getNum_miembros()+1."' WHERE ID = '".$evento->getId()."'"; 
          $query ="INSERT INTO esInvitado (ID_Miembro, ID_Evento, RSVP)  VALUES ( '".$invit->getId_perfil()."' , '".$invit->getId_evento()."' , '".$invit->getAsistire()."')";

          if(!mysql_query($query, $this->target)){
	    throw new Exception("Error al asistir");
	  }
          return;
	}catch(Exception $e){
            echo "Error al asistir";
        }
   }
   
   public function buscarAsistencia(invitacion_evento $invit){
          
          $query ="SELECT * FROM esInvitado WHERE ID_Miembro ='".$invit->getId_perfil()."' AND ID_Evento  = '".$invit->getId_evento()."'";

          if(!mysql_query($query, $this->target)){
		 throw new Exception("Error al buscar la asistencia");
	  }else{
                $q = mysql_query($query, $this->target);
		if (mysql_num_rows($q)>0){
		   return mysql_fetch_assoc($q);
		}
		else
                    return null;
		}
   }
	//LOGIN 
        
   public function buscarLogin( $usuario ) {
      $select = ("SELECT usrname, passwd, esAdmin, estado FROM Perfil WHERE usrname='$usuario'");
	   if (!($query = mysql_query($select, $this->target))) {
         throw new Exception("Error al buscar el login");
       }
      if (mysql_num_rows($query)>0){
         return mysql_fetch_array($query);
      }
      return null;
   }
      
   //FORO   
   public function obtenerForo() {
      $query = mysql_query("SELECT * FROM Foro");
      if (!$query)
			return null;
      $row = mysql_fetch_array($query);
      return $row['ID'];
   }
   
   public function obtenerTemas( $foro ) {
      $query = mysql_query(
         "SELECT * FROM Tema WHERE foroID = ".$foro->getId()." AND visible = 1"
      );
      if (!$query)
			return null;
      $result = array();
      while($row = mysql_fetch_array($query))
      {
         $tema = new Tema($row['titulo']);
         $tema->setFecha_creacion($row['fecha_creacion']);
         $tema->setFecha_ult_modif($row['fecha_ult_modif']);
         $tema->setCantidad_comentarios($row['cantidad_comentarios']);
         $tema->setMuroID($row['muroID']);
         $tema->setForoID($row['foroID']);
         array_push($result, $tema);
      }
      return $result;
   }
   
   /* Metodo para agregar a la base de datos un nuevo tema.
    * Recibe como parametro el tema a agregar. No debe existir
	* un tema con el mismo titulo en la base de datos
    */
	public function agregarTema($tema){
	  $query = "INSERT INTO Muro (Num_max_pub) VALUES (5)";
     if(!mysql_query($query)){
       throw new Exception("Error al crear el muro");
     }
     $muroID = mysql_insert_id();
	  $query = "INSERT INTO Tema (fecha_creacion, titulo, fecha_ult_modif, cantidad_comentarios, foroID, muroID)
  	            VALUES ('".$tema->getFecha_creacion()."', '".$tema->getTitulo()."', '".$tema->getFecha_ult_modif().
				"', ".$tema->getCantidad_comentarios().", ".$tema->getForoID().", ".$muroID.")";
	  if(!mysql_query($query, $this->target)){
	    throw new Exception("Error al agregar el tema");
	  }
	}
	
	/* Metodo que devuelve una instancia de Tema con los atributos encontrados en la base de datos
	 * para el titulo indicado. Devuelve null si no se encontro ninguno.
	 */
	public function buscarTemaTitulo($titulo){
	  $query = "SELECT * FROM Tema WHERE titulo = '".$titulo."' AND visible = 1";
	  $result = mysql_query($query, $this->target);
	  if(mysql_num_rows($result) == 0){
	    return null;
	  }
	  $temaA = mysql_fetch_array($result);
	  $tema = new Tema($temaA["titulo"]);
     $tema->setId($temaA["ID"]);
	  $tema->setTitulo($temaA["titulo"]);
  	  $tema->setFecha_creacion($temaA["fecha_creacion"]);
	  $tema->setFecha_ult_modif($temaA["fecha_ult_modif"]);
	  $tema->setCantidad_comentarios($temaA["cantidad_comentarios"]);
	  $tema->setMuroID($temaA["muroID"]);
	  $tema->setForoID($temaA["foroID"]);
	  
	  return $tema;
	}
   
	public function buscarTemaID($id){
	  $query = "SELECT * FROM Tema WHERE ID = '".$id."' AND visible = 1";
	  $result = mysql_query($query, $this->target);
	  if(mysql_num_rows($result) == 0){
	    return null;
	  }
	  $temaA = mysql_fetch_array($result);
	  $tema = new Tema($temaA["titulo"]);
     $tema->setId($temaA["ID"]);
	  $tema->setTitulo($temaA["titulo"]);
  	  $tema->setFecha_creacion($temaA["fecha_creacion"]);
	  $tema->setFecha_ult_modif($temaA["fecha_ult_modif"]);
	  $tema->setCantidad_comentarios($temaA["cantidad_comentarios"]);
	  $tema->setMuroID($temaA["muroID"]);
	  $tema->setForoID($temaA["foroID"]);
	  
	  return $tema;
	}
   
   /* Metodo que elimina la instancia de tema contenida en $tema de la base de datos
    */
   public function eliminarTema($tema){
      $query = "UPDATE Tema SET visible = 0 WHERE titulo = '".$tema->getTitulo()."'";
      if(!mysql_query($query)){
        throw new Exception("Error al eliminar el tema");
      }
      return;
   }

   // PARTE DE SYSTEMS SOLUTIONS
   function insert($tabla, $valores){
        $query = "INSERT INTO " . $tabla . " VALUES(";
        $i = 0;
        $cota = count($valores);
        for($i; $i < $cota; $i = $i + 1){
            //echo "$valores[$i] <br/ >";
			if($i != $cota - 1){
                $query = $query . "'" . $valores[$i] . "',";
            }else{
                $query = $query . "'" . $valores[$i] . "');";
            }
        }
        /*Query que permite hacer que se suban archivos de hasta 2 megas*/
        mysql_query("SET GLOBAL max_allowed_packet=16*1024*1024;",$this->target) or die ("Error: " . mysql_error());
        mysql_query($query, $this->target) or die ("Error en el insert: " . mysql_error());
        /*Tablas como muro al crearlas la base de datos genera una clave
          automaticamente, pero que es necesario saberla*/
        $id_generado = mysql_insert_id();
                return $id_generado;        
  }
  
 
  /*
   * Metodo utilizado para obtener tuplas de la base de datos basandose en las solicitudes de
   * coincidencia que se reciban.
   * 
   * Parametros: String tabla -> Nombre de la tabla de la que se desean obtener los atributos
   *             String[] id -> Arreglo con los valores de los atributos de la tabla con los que se quiere 
   *                            buscar coincidencia. Si alguna entrada es vacia, se asume que no importa
   *                            el valor de dicho atributo
   *             String[] idName -> Arreglo de strings en el que la posicion 'i' corresponde al nombre
   *                                de la columna de la tabla 'tabla' con la que se desea hacer match
   *                                el valor 'id[i]'.
   
   */
  function select2($tabla, $id, $idName){
		$i = 0;
		$first = true;
		$query = "SELECT * FROM " . $tabla;
                
		$cota = count($id);
        for($i; $i < $cota; $i = $i + 1)
		{
			if($id[$i] == "")
			  continue;
			if ($first)
			{
				$query = $query . " WHERE " . $idName[$i] . " = '" . $id[$i] . "'";
				$first = false;
			}
			else
			{
				$query = $query . " AND " . $idName[$i] . "='" . $id[$i] . "'";
			}
		}
		$query = $query . ";";		
		$result = mysql_query($query, $this->target) or die 
                        ("Error en el select2: " . mysql_error());
		$arreglo;
		$i=0;
		$cant = mysql_num_fields($result);
		while($row = mysql_fetch_array($result))
		{
			for($j = 0; $j<$cant;$j = $j+1)
			{
			$arreglo[$i]=$row[$j];
			$i = $i+1;
			}	
			
		}
		if (isset($arreglo))
		return $arreglo;	
		
   }

    /*
     * Metodo utilizado para obtener tuplas con el atributo especifico 
     * de la base de datos basandose en las solicitudes de coincidencia que se reciban.
     * 
     * Parametros: String tabla -> Nombre de la tabla de la que se desean obtener los atributos
     *             String[] id -> Arreglo con los valores de los atributos de la tabla con los que se quiere 
     *                            buscar coincidencia. Si alguna entrada es vacia, se asume que no importa
     *                            el valor de dicho atributo
     *             String[] idName -> Arreglo de strings en el que la posicion 'i' corresponde al nombre
     *                                de la columna de la tabla 'tabla' con la que se desea hacer match
     *                                el valor 'id[i]'.
     *             String idReturn -> Atributo de la tabla a retornar 
     
   */
   function select4($tabla, $idName, $id,$idReturn)
   {
		$query = "SELECT ". $idReturn . " FROM " . $tabla . " WHERE " . $idName . " = '" . $id . "';";
                $result = mysql_query($query, $this->target) or die("Error: " . mysql_error());		
		$i=0;
		$cant = mysql_num_fields($result);
		while($row = mysql_fetch_array($result))
		{
			for($j = 0; $j<$cant;$j = $j+1)
			{
				$arreglo[$i]=$row[$j];
				$i = $i+1;
			}	
			
		}
		if (isset($arreglo))    
		return $arreglo;	
   }
   
   
   function selectTodo($tabla)
   {		
		$query = "SELECT * FROM " . $tabla . ";";
		$result = mysql_query($query, $this->target) or die("Error: " . mysql_error());
		$i=0;
		$cant = mysql_num_fields($result);
		while($row = mysql_fetch_array($result))
		{
			for($j = 0; $j<$cant;$j = $j+1)
			{
				$arreglo[$i]=$row[$j];
				$i = $i+1;
			}	
			
		}
		mysql_close($this->target);  
		if (isset($arreglo))
		return $arreglo;	
   }
   
   function modificarDatos()
   {
		$result = "UPDATE ";
		$result.= func_get_arg(0);
		$tableName = func_get_arg(0);
		$result .= " SET " . func_get_arg(1);
		
		if( func_num_args()>2){
			$result .= " WHERE ";
			for ($i = 2;$i < func_num_args() - 1;$i++) {
				$result .= func_get_arg($i) . " AND ";
			}
			$result .= func_get_arg(func_num_args() - 1) . ";";
		}				
		mysql_query($result) or die("error: " . mysql_error());
		mysql_close($this->target);
                return $result;
	}
	
	function modifSeguridad($id,$atrib,$nuevo)
	{
		if ($atrib == "fotos")
		{
			$this->modificarDatos("seguridad", "privac_fotos = '$nuevo'", "id= '$id'");
		}
		elseif ($atrib == "datos")
		{
			$this->modificarDatos("seguridad", "privac_datos = '$nuevo'", "id= '$id'");
		}
		elseif ($atrib == "muro")
		{
			$this->modificarDatos("seguridad", "privac_muro = '$nuevo'", "id= '$id'");
		}
	}

	function agregarDocumento($nombre, $tipo, $tamano, $contenido, $id_Perfil, $id_Grupo){
      $valores[0] = "";
      $valores[1] = $nombre;
      $valores[2] = $tipo;
      $valores[3] = $tamano;
      $valores[4] = $contenido;
      $valores[5] = $id_Perfil;
      $valores[6] = $id_Grupo;
      $this->insert("documento", $valores);   
   }
  
	function agregarPersona($usuario, $contrasena, $pregunta, $respuesta, $estado){
      $valores[0] = $usuario;
      $valores[1] = $contrasena;
      $valores[2] = $pregunta;
      $valores[3] = $respuesta;
      $valores[4] = $estado;
      $this->insert("persona", $valores);   
   }
   
   
   
   function insertarAbuso($arr)
   {
       $query = "Insert INTO `pinf`.`abuso` (`id`, `nombre_denunciante`, `id_denunciante`, `fecha`, `descripcion`, `tipo`, `URL`, `estado`)
       VALUES (NULL " . ", '" . $arr[1] . "', '"
       . $arr[2] ."', CURRENT_TIMESTAMP, '" . $arr[4] . "', '" . $arr[5] . "', '"
       . $arr[6] . "', '" . $arr[7]. "') ;";
       mysql_query($query,$this->target) or die ("Error en insertar abuso: " .mysql_error() );

       return;
   }
   /*Función que devuelve todos los abusos leidos y no leidos, no devuelve los
    * que ya fueron resueltos
    */
   
   function mostrarAbusos(){
       $query = "Select * From abuso where estado = 'No leido' OR estado = 'Leido'";
       $result = mysql_query($query, $this->target) or die 
                        ("Error en el select2: " . mysql_error());
		$arreglo;
		$i=0;
		$cant = mysql_num_fields($result);
		while($row = mysql_fetch_array($result))
		{
			for($j = 0; $j<$cant;$j = $j+1)
			{
			$arreglo[$i]=$row[$j];
			$i = $i+1;
			}	
			
		}
		if (isset($arreglo))
		return $arreglo;
   }
  
   /* esta funcion va a recibir el id de un abuso, lo va a marcar como leido
    * y va a conseguir el nombre de la persona que lo reporto.
    */
   function mostrarAbuso($id){
       $ids[0] = $id;
       $idName[0] = "id";
      $abuso = $this->select2("abuso",$ids,$idName); 
      if($abuso[7] == "No leido"){
          $query = "UPDATE abuso SET estado = 'Leido' WHERE id = ". $id . ";";
          mysql_query($query,$this->target);
          $abuso = $this->select2("abuso",$ids,$idName);
      }
      
      return $abuso;
   }
   
   /*
    * funcion que soluciona un abuso, marcandolo con el estado de solucionado 
    */
   function solucionarAbuso($id)
   {
       $query = "UPDATE abuso SET estado = 'Solucionado' WHERE id = " .$id .";";
       echo "<br> el query es " .$query . "<br>";
       mysql_query($query,$this->target);
       return;
   }
  /*Funcion para probar Muro*/
  function agregarMuro()
  { 			
    $query = "SELECT * FROM Muro WHERE id = 1";  
    $result = mysql_query($query,$this->target) or die("error: " . mysql_error());
    $existe = mysql_fetch_array($result);
    if (!$existe)
    {
     $result = "INSERT INTO Muro VALUES(1,5,0)";   
     mysql_query($result,$this->target) or die("error: " . mysql_error()); 
    }
    mysql_close($this->target);
  }

  /*
   * Metodo utilizado para obtener las publicaciones
   * Parametros
   * id = id del muro
   */
  function selectPublicacion($id){
		$query = "SELECT * FROM Publicacion WHERE Muro= '".$id."' AND visible='1' ORDER BY fechaRealizacion DESC;";        		
		$result = mysql_query($query, $this->target) or die 
                        ("Error en el select publicacion: " . mysql_error());
		$arreglo;
		$i=0;
		$cant = mysql_num_fields($result);
		while($row = mysql_fetch_array($result))
		{
			for($j = 0; $j<$cant;$j = $j+1)
			{
			$arreglo[$i]=$row[$j];
			$i = $i+1;
			}	
			
		}
		if (isset($arreglo))
		return $arreglo;	
   }
  
   /*
   * Metodo utilizado para obtener los comentarios
   * Parametros
   * id = id del muro
   */
  function selectComentario($id){
		$query = "SELECT * FROM comentario WHERE Publicacion= '".$id."' AND visible='1' ORDER BY fechaRealizacion DESC;";        		
		$result = mysql_query($query, $this->target) or die 
                        ("Error en el select2: " . mysql_error());
		$arreglo;
		$i=0;
		$cant = mysql_num_fields($result);
		while($row = mysql_fetch_array($result))
		{
			for($j = 0; $j<$cant;$j = $j+1)
			{
			$arreglo[$i]=$row[$j];
			$i = $i+1;
			}	
			
		}
		if (isset($arreglo))
		return $arreglo;	
   }
   
   /*PARTE DE CARLOS CASTILLO*/
  public function agregarAmistad($usuario1,$usuario2){
		$query = mysql_query("INSERT INTO  esAmigo VALUES ('".$usuario1."' , '".$usuario2."');");
        if (!$query){
		  throw new Exception("Error al agregar amistad");
		}
                mysql_close($this->target);
		return;
    }
     public function eliminarAmistad($usuario1,$usuario2){
		$query = mysql_query("DELETE FROM esAmigo WHERE usuarioA = '".$usuario1."' AND usuarioB = '".$usuario2."' OR usuarioA = '".$usuario2."' AND usuarioB = '".$usuario1."';");
        if (!$query){
		  throw new Exception("Error al eliminar amistad");
		}
                mysql_close($this->target);
		return;
    }
   public function buscarAmistades($idUsuario){
        $query = mysql_query ("SELECT * FROM esAmigo WHERE usuarioA = '".$idUsuario."' OR usuarioB ='".$idUsuario."' ;" ) or die(mysql_error());
        $resultado = array();
        for($i = 0; $i < mysql_num_rows($query); ++$i){
            array_push($resultado, mysql_fetch_array($query));
        }
        mysql_close($this->target);
        return $resultado;
                    
    }
    public function existeAmistad($id1,$id2){
        $query = mysql_query ("SELECT * FROM esAmigo WHERE (usuarioA = '".$id1."' AND usuarioB = '".$id2."') OR ( usuarioA = '".$id2."' AND usuarioB = '".$id1."') ;" ) or die(mysql_error());
        if(mysql_num_rows($query)>0)
           return true;
         return false;  
    }
    
    public function existeSolicitud($id1,$id2){
        $query = mysql_query ("SELECT * FROM solicitud WHERE (idEmisor = '".$id1."' AND idReceptor = '".$id2."') OR ( idEmisor = '".$id2."' AND idReceptor = '".$id1."') ;" ) or die(mysql_error());
        if(mysql_num_rows($query)>0)
           return true;
         return false;  
    }
   function agregarSolicitud($idEmisor , $idReceptor, $descripcion){
    $valores[0] = $idEmisor;
    $valores[1] = $idReceptor;
    $valores[2] = $descripcion;
    $valores[4] = 'CURRENT_TIMESTAMP';
    $this->insert("solicitud", $valores);  
    mysql_close($this->target);
   }

   public function eliminarSolicitud($Emisor,$Receptor){
		$query = mysql_query("DELETE FROM solicitud WHERE idEmisor= '".$Emisor."' AND idReceptor = '".$Receptor."';");
        if (!$query){
		  throw new Exception("Error al eliminar solicitud");
		}
		mysql_close($this->target);
    }
    public function buscarSolicitud($Receptor){
		$query = mysql_query ("SELECT * FROM solicitud WHERE idReceptor = '".$Receptor."';" ) or die(mysql_error());
		$resultado = array();
                for($i = 0; $i < mysql_num_rows($query); ++$i){
		  array_push($resultado, mysql_fetch_array($query));
		}
                mysql_close($this->target);
		return $resultado;
	}
        
    public function eliminarDocumento($id){
        $query = mysql_query("DELETE FROM documento WHERE id = '".$id."';");
        return;
    }
    
     public function conseguirDocumentos($id,$idName){
        $resultado = $this->select2("documento",$id, $idName);
        return $resultado;
    }

    
    public function desactivarCuenta($usuario){
         $this->modificarDatos("Perfil","estado = 'suspendido'","usrname = '" . $usuario . "'");
    }
    
    public function designarAdministrador($usuario){
         $this->modificarDatos("perfil","esAdmin = 1","usrname = '" . $usuario . "'");
    }
    
    public function esAmigo($idObservador, $idReceptor)
    {
        $query = "SELECT * FROM esAmigo WHERE (usuarioA = '".$idObservador."' AND usuarioB = '".$idReceptor."') OR ";
        $query = $query . "(usuarioB = '".$idObservador."' AND usuarioA = '".$idReceptor."');";
        $result = mysql_query($query) or die("Error en esAmigo: " . mysql_error());
        $arr = mysql_fetch_array($result);
        $count = count($arr);
        if ($count == 0)
            return false;
        else
            return true;
        
        
    }
    
}    
?>
